/**
 * Progetto PRAISED.
 * 14/dic/2010
 */
package it.uniroma3.dia.praised.pubmed.wrapper;

import it.uniroma3.dia.praised.factory.WebClientFactory;
import it.uniroma3.dia.praised.pubmed.model.Article;
import it.uniroma3.dia.praised.pubmed.model.Section;
import it.uniroma3.dia.praised.util.PDFTextParser;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * @author Accosta Augusto
 * @author Lopez Elisabetta
 *
 */
public class WrapperPubMed {
	
	
	/**
	 * Costruttore: crea la Factory
	 */
	public WrapperPubMed() {
	}
	
	/**
	 * Metodo che popola l'articolo passato come parametro estraendo le informazioni dalla pagina web
	 * @param articolo - l'articolo da popolare
	 * @param urll'url della pagina da cui estrarre le informazioni
	 * @param resultExtraction - variabile che memorizza l'esito dell'estrazione
	 */
	public boolean wrapPageIntoArticle(Article articolo, URL url) {
					
			System.out.println("PROCESSING PAGE ... " + url.toString());
			HtmlPage page;
			
			try {
				page = WebClientFactory.newHtmlPage(url);
				
				/* Recupero le informazioni relative alle altre sezioni del documento */
				List<Section> sezioni = this.recuperaSezioni(page); 
				articolo.setSezioni(sezioni);
				
			} catch (FailingHttpStatusCodeException e) {
				e.printStackTrace();
			} catch (Exception e) {
				return false;
			}
			
			return true;
	}
	
	/**
	 * Metodo che recupera il contenuto delle singole sezioni della pagina web relativa all'articolo corrente
	 * 
	 * @param page - la pagina da cui estrarre le informazioni
	 * @return sezioni
	 */
	@SuppressWarnings("unchecked")
	private List<Section> recuperaSezioni(HtmlPage page) {
		
		List<Section> sezioni = new ArrayList<Section>();
		
		String xpath = "//table[@id='Table3']/tbody/tr[3]/td[2]/div[@class='sec'] ";
		List<HtmlDivision> elencoDIV = (List<HtmlDivision>) page.getByXPath(xpath);
				
		/* Estraggo le informazioni dalle singole sezioni */
		for (HtmlDivision htmlDivision : elencoDIV) {
			Section sez = new Section();
			
			/* Poich� ci sono alcune sezioni che hanno il menu delle opzioni al loro interno, mentre altre no, � necessario gestire
			 * entrambi i casi */
			List<HtmlElement> divSez = htmlDivision.getElementsByAttribute("div", "class", "head1 section-title");
			
			if(divSez.size() != 0) {
				if (divSez.get(0).getElementsByTagName("div").size() == 2)
					sez.setTitolo(divSez.get(0).getElementsByTagName("div").get(1).getTextContent());
				else
					sez.setTitolo(divSez.get(0).getElementsByTagName("div").get(0).getTextContent());
					
				sez.setContents(htmlDivision.getElementsByAttribute("div", "class", "section-content").get(0).getTextContent());
				
				sezioni.add(sez);
			}
		}
		
		return sezioni;
	}
	

	public void wrapPdf(Article articolo, URL url) {
		
		System.out.println("PROCESSING PDF ... " + url.toString());
		
		PDFTextParser pdfTextParserObj = new PDFTextParser();
	    String pdfToText;
		
	    pdfToText = pdfTextParserObj.pdftoText(url);
		
		if (pdfToText == null) {
			System.out.println("PDF to Text Conversion failed.");
		}
		else {
			pdfTextParserObj.writeTextToFile(pdfToText, articolo.getPMCID() + ".txt");
		}
		
	}

}
